﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Data;
using System.Windows.Documents;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Imaging;
using System.Windows.Shapes;
using System.Collections.ObjectModel;
using System.Data;
using produccion.reportes;

using System.Windows.Controls.Primitives;//FJRF - Agregada para el manejo de las celdas del grid

namespace produccion.forms
{
    /// <summary>
    /// Lógica de interacción para FRMentMatPr.xaml
    /// </summary>
    public partial class FRMentMatPr : Window
    {
        entMatPr _entMatPr;

        MDOgeneral MdoGeneral = new MDOgeneral();//FJRF - Traemos toda la informacion y funciones de MdoGeneral
        DataTable DtConsulta;//FJRF - Usamos este DataTable para hacer consultas generales
        String StrConsulta;//FJRF - Usamos este DataTable para hacer consultas generales

        public FRMentMatPr()
        {
            InitializeComponent();
            _entMatPr = (entMatPr)this.DataContext;
            limpiar();
        }

        public void limpiar()
        {
            texNum.Text = "";
            radNor.IsChecked=true;
            datFec.SelectedDate=DateTime.Now;
            comAlm.SelectedValue="";
            texCon.Text="";
            comPro.SelectedValue="";
            comProCod.SelectedValue = "";
            texDoc.Text = "";
            texOrd.Text = "";
        }

        private void texNum_TextChanged(object sender, TextChangedEventArgs e)
        {
            _entMatPr.consultar();
            if (!_entMatPr.EncEnMatp.EXISTE)
            {
                datFec.SelectedDate = DateTime.Now;
                texCon.Text = "";
                texDoc.Text = "";
                texOrd.Text = "";
                _entMatPr.total = 0;

                comAlm.SelectedIndex = 0;
                comPro.SelectedIndex = 0;
                comProCod.SelectedIndex = 0;
            }
        }

        string cam;
        private void texCod_TextChanged(object sender, TextChangedEventArgs e)
        {
            if (_entMatPr.sEntMerca == null) { return; }
            if (_entMatPr.sEntMerca.codigo.Length == 10)
            {
                clases.CLSMAEMAT maemat;
                maemat = new clases.CLSMAEMAT { CODMAT_MAT = _entMatPr.sEntMerca.codigo.Substring(0, 6) };
                maemat.ConsMat();
                if (!maemat.EXISTE) 
                {
                    buscMatp(_entMatPr.sEntMerca.codigo);
                }
                cam = ((TextBox)sender).Text;
            }
        }

        private void butNue_Click(object sender, RoutedEventArgs e)
        {
            _entMatPr.nuevMatp();
            texNum.Focus();
            texNum.Select(0, 0);
        }

        private void butGua_Click(object sender, RoutedEventArgs e)
        {
            _entMatPr.guardarMatp(wPnot);
            texNum.Focus();
            texNum.Select(0, 0);
            _entMatPr.imprimir();
        }

        private void butImp_Click(object sender, RoutedEventArgs e)
        {
            try
            {
                _entMatPr.imprimir();
            }
            catch (Exception ex) { MessageBox.Show(ex.Message); }
        }

        private void butSal_Click(object sender, RoutedEventArgs e)
        {
            this.Close();
        }

        private void datMatp_LostFocus(object sender, RoutedEventArgs e)
        {
            Boolean errors = (from c in (from object i in datMatp.ItemsSource select datMatp.ItemContainerGenerator.ContainerFromItem(i))
                              where c != null select Validation.GetHasError(c)).FirstOrDefault(x => x);
            _entMatPr.ERROR = errors;

            if (_entMatPr.EntMerca.ToList().FindAll(x=>(x.codigo!=null) && !x.codigo.Equals("")).Count==0 ) { _entMatPr.ERROR = true; }
            _entMatPr.totalizar();
        }

        private void radNor_Checked(object sender, RoutedEventArgs e)
        {
            texNum.Text = "";
            texNum_TextChanged(null, null);
            textBlock6.Text="Proveedor";
            _entMatPr.NROORDP_DEN = "";
            comPro.Visibility = Visibility.Visible;
            comProCod.Visibility = Visibility.Visible;
            texOrd.Visibility = Visibility.Hidden;
        }
  
        private void radDev_Checked(object sender, RoutedEventArgs e)
        {
            textBlock6.Text="Orden.Prod";
            comPro.Visibility = Visibility.Hidden;
            comProCod.Visibility = Visibility.Hidden;
            texOrd.Visibility = Visibility.Visible;
            _entMatPr.EncEnMatp.CODPRV_EEN = " ";
            texNum.Text = "";
            texNum_TextChanged(null, null);
        }

        private void datMatp_BeginningEdit(object sender, DataGridBeginningEditEventArgs e)
        {
            _entMatPr.CAMBIO = true;
        }

        private void buscMatp(object sender, RoutedEventArgs e)
        {
            buscMatp("");
        }

        private void buscMatp(string descripcion)
        {
            FRMBuscarCol f = new FRMBuscarCol();

            f.EsReferencia = false;
            f.RequiereColor = true;
            f.txtNombre.Text = descripcion;
            f.txtNombre.Focus();
            f.txtNombre.Select(f.txtNombre.Text.Length, 0);
            f.ShowDialog();
           
            entMatPr.MateriaPrima mat = (entMatPr.MateriaPrima)datMatp.SelectedItem;
            Boolean IsFirst = true;
            foreach (DataRow r in f.dtRetorno.Rows) 
            {
                if (IsFirst)
                {
                    if (!String.IsNullOrEmpty(r[0].ToString()))
                    {
                        mat.codigo = r[0].ToString();
                    }
                    IsFirst = false;
                }
                else 
                {
                    if (!String.IsNullOrEmpty(r[0].ToString()))
                    {
                        _entMatPr.EntMerca.Add(new entMatPr.MateriaPrima { cantidad = 1, codigo = r[0].ToString() });
                    }
                 }
            }
           
            if (!String.IsNullOrEmpty(f.Retorno))
            {
                mat.codigo = f.Retorno;
            }
        }

        private void texCod_KeyDown(object sender, KeyEventArgs e)
        {
            if (e.Key == Key.F2)
            {
                buscMatp(null, null);
            }
        }

        private void datMatp_KeyUp(object sender, KeyEventArgs e)
        {
            Boolean sw = true;

            if (e.Key.Equals(Key.F3) || e.Key.Equals(Key.Enter))
            {
                if (datMatp.CurrentCell.Column.Header.ToString().Equals("Codigo") && sw) 
                {                    
                     datMatp.CurrentColumn=datMatp.Columns[3];
                     sw = false;
                }

                if (datMatp.CurrentCell.Column.Header.ToString().Equals("Cantidad")&&sw)
                {
                    datMatp.CurrentColumn = datMatp.Columns[0];
                    sw = false;
                }
            }

            if (e.Key.Equals(Key.F2)) 
            {
                if (datMatp.CurrentCell.Column.Header.ToString().Equals("Codigo"))
                {
                    entMatPr.Instance.sEntMerca.buscMatp("");
                }
            }
        }

        private void Window_Closed(object sender, EventArgs e)
        {
            entMatPr.Instance = null;
        }

        private void botBusGru_Click(object sender, RoutedEventArgs e)
        {
            entMatPr.Instance.ConsPro();
        }

        private void Window_Loaded(object sender, RoutedEventArgs e)
        {
            Keyboard.Focus(texNum);
        }

        private void datMatp_PreviewKeyDown(object sender, KeyEventArgs e)
        {
            var elemento = e.OriginalSource as UIElement;
            if (e.Key == Key.Enter && elemento != null)
            {
                e.Handled = true;
                elemento.MoveFocus(new TraversalRequest(FocusNavigationDirection.Next));
            }
        }

        private void texDoc_LostFocus(object sender, RoutedEventArgs e)
        {
            //int indice = entMatPr.Instance.EntMerca.Count - 1;
            //datMatp.SelectedIndex = indice;
            //if (datMatp.SelectedIndex > 1)
            //{
            //    datMatp.ScrollIntoView(datMatp.Items[datMatp.SelectedIndex - 1]);
            //    datMatp.ScrollIntoView(datMatp.Items[datMatp.SelectedIndex]);

            //    var dataGridCellInfo = new DataGridCellInfo(datMatp.Items[indice], datMatp.Columns[0]);
            //    datMatp.CurrentCell = dataGridCellInfo;
            //    datMatp.BeginEdit();
            //}
            //else
            //{
            //    datMatp.ScrollIntoView(datMatp.Items[0]);

            //    var dataGridCellInfo = new DataGridCellInfo(datMatp.Items[0], datMatp.Columns[0]);
            //    datMatp.CurrentCell = dataGridCellInfo;
            //    datMatp.BeginEdit();
            //}
        }

        //
        // SINGLE CLICK EDITING
        //
        private void DataGridCell_PreviewMouseLeftButtonDown(object sender, MouseButtonEventArgs e)
        {
            DataGridCell cell = sender as DataGridCell;
            if (cell != null && !cell.IsEditing && !cell.IsReadOnly)
            {
                if (!cell.IsFocused)
                {
                    cell.Focus();
                }
                DataGrid dataGrid = FindVisualParent<DataGrid>(cell);
                if (dataGrid != null)
                {
                    if (dataGrid.SelectionUnit != DataGridSelectionUnit.FullRow)
                    {
                        if (!cell.IsSelected)
                            cell.IsSelected = true;
                    }
                    else
                    {
                        DataGridRow row = FindVisualParent<DataGridRow>(cell);
                        if (row != null && !row.IsSelected)
                        {
                            row.IsSelected = true;
                        }
                    }
                }
            }
        }

        static T FindVisualParent<T>(UIElement element) where T : UIElement
        {
            UIElement parent = element;
            while (parent != null)
            {
                T correctlyTyped = parent as T;
                if (correctlyTyped != null)
                {
                    return correctlyTyped;
                }

                parent = VisualTreeHelper.GetParent(parent) as UIElement;
            }
            return null;
        }
        private void comProCod_SelectionChanged(object sender, SelectionChangedEventArgs e)
        {
            PrivVCargarGrid();//FJRF - Cargamos el grid
        }
        private void comProCod_KeyDown(object sender, KeyEventArgs e)
        {
            if (e.Key == Key.Enter)
            {
                PrivVCargarGrid();//FJRF - Cargamos el grid
            }
        }
        private void PrivVCargarGrid()
        {
            if (texNum.Text != "")
            {
                if (comProCod.SelectedValue != null)
                {
                    StrConsulta = "SELECT ";//FJRF - Armamos la consulta
                    StrConsulta = StrConsulta + "NROPED_EPP AS NRO, FECPED_EPP AS FECHA, FECENT_EPP AS ENTREGA ";//FJRF - Armamos la consulta
                    StrConsulta = StrConsulta + "FROM encpprp, VIS_PEDPEN ";//FJRF - Armamos la consulta
                    StrConsulta = StrConsulta + "WHERE CODPRV_EPP = '" + comProCod.SelectedValue + "' ";//FJRF - Armamos la consulta
                    StrConsulta = StrConsulta + "AND ESTPED_EPP = 'P' ";//FJRF - Armamos la consulta
                    StrConsulta = StrConsulta + "AND CODPRV_EPP = CODIGOPROVEEDOR ";//FJRF - Armamos la consulta
                    StrConsulta = StrConsulta + "AND NROPED_EPP = NUMEROPEDIDO ";//FJRF - Armamos la consulta
                    StrConsulta = StrConsulta + "GROUP BY NROPED_EPP, FECPED_EPP, FECENT_EPP ";//FJRF - Armamos la consulta
                    StrConsulta = StrConsulta + "ORDER BY  NROPED_EPP";//FJRF - Armamos la consulta

                    DtConsulta = new DataTable();//FJRF - Limpiamos la tabla por si tiene datos ya que esta se usa para otros procesos
                    DtConsulta = MdoGeneral.consulta(StrConsulta);//FJRF - Cargamos la consulta con los datos encontrados

                    DtgPedidos.ItemsSource = DtConsulta.DefaultView;
                }
            }
        }

        private void DtgPedidos_AutoGeneratingColumn(object sender, DataGridAutoGeneratingColumnEventArgs e)
        {
            e.Column.IsReadOnly = true;//FJRF - Inavilita las columnas para que no se pueda escribir sobre ella

            if (e.PropertyType == typeof(System.DateTime))
                (e.Column as DataGridTextColumn).Binding.StringFormat = "dd/MM/yyyy";


        }
        private void DtgMateriales_AutoGeneratingColumn(object sender, DataGridAutoGeneratingColumnEventArgs e)
        {
            e.Column.IsReadOnly = true;//FJRF - Inavilita las columnas para que no se pueda escribir sobre ella

            string strNombreColumna = "";//FJRF - Variable para saber el nombre de la columna
            strNombreColumna = e.Column.Header.ToString();//FJRF - Extraemos el nombre de la columna

            if (strNombreColumna == "PEDIDO" || strNombreColumna == "RECIBIDO" || strNombreColumna == "DESPACHADO" || strNombreColumna == "PENDIENTE")
            {
                (e.Column as DataGridTextColumn).Binding.StringFormat = "{0:##,#0.##}";//FJRF - Enviamos el formato a la celda
                (e.Column as DataGridTextColumn).CellStyle = newCellStyleAlinearDerecha();//FJRF - Alineamos la celda a la derecha
            }
        }
        private void DtgPedidos_MouseDoubleClick(object sender, MouseButtonEventArgs e)
        {
            String StrNroPedido;
            try
            {
                if (DtgPedidos.SelectedItem == null)
                    return;
                DataRowView dr = DtgPedidos.SelectedItem as DataRowView;
                DataRow dr1 = dr.Row;
                StrNroPedido = Convert.ToString(dr1.ItemArray[0]);

                StrConsulta = "SELECT CODIGOREFERENCIA AS CODMAT,  NOMBREREREFENCIA AS MATERIAL,  CODIGOCOLOR AS CODCOL,  NOMBRECOLOR AS COLOR,  PEDIDO,  RECIBIDO,  DESPACHADO,  PENDIENTE ";//FJRF - Armamos la consulta
                StrConsulta = StrConsulta + "FROM VIS_PEDPEN ";//FJRF - Armamos la consulta
                StrConsulta = StrConsulta + "WHERE NUMEROPEDIDO = '" + StrNroPedido + "' ";//FJRF - Armamos la consulta
                StrConsulta = StrConsulta + "AND CODIGOPROVEEDOR = '" + comProCod.SelectedValue + "' ";//FJRF - Armamos la consulta

                DtConsulta = new DataTable();//FJRF - Limpiamos la tabla por si tiene datos ya que esta se usa para otros procesos
                DtConsulta = MdoGeneral.consulta(StrConsulta);//FJRF - Cargamos la consulta con los datos encontrados

                DtgMateriales.ItemsSource = DtConsulta.DefaultView;
            }
            catch (Exception ex)
            {
                MessageBox.Show(ex.Message);
            }
        }
        private void DtgMateriales_MouseDoubleClick(object sender, MouseButtonEventArgs e)
        {
            String StrCodigoReferencia, StrReferencia, StrColor;
            try
            {
                if (DtgMateriales.SelectedItem == null)
                    return;
                DataRowView dr = DtgMateriales.SelectedItem as DataRowView;
                DataRow dr1 = dr.Row;

                StrReferencia = Convert.ToString(dr1.ItemArray[0]);
                StrColor = Convert.ToString(dr1.ItemArray[2]);

                StrCodigoReferencia = StrReferencia + StrColor;

                _entMatPr.EntMerca.Add(new entMatPr.MateriaPrima { cantidad = 1, codigo = StrCodigoReferencia });
            }
            catch (Exception ex)
            {
                MessageBox.Show(ex.Message);
            }
        }

        #region ParaObtenerLasPropiedadesDeLaCeldaDelGrid
        static class DataGridHelper
        {
            static public DataGridCell GetCell(DataGrid dg, int row, int column)
            {
                DataGridRow rowContainer = GetRow(dg, row);

                if (rowContainer != null)
                {
                    DataGridCellsPresenter presenter = GetVisualChild<DataGridCellsPresenter>(rowContainer);

                    // try to get the cell but it may possibly be virtualized
                    DataGridCell cell = (DataGridCell)presenter.ItemContainerGenerator.ContainerFromIndex(column);
                    if (cell == null)
                    {
                        // now try to bring into view and retreive the cell
                        dg.ScrollIntoView(rowContainer, dg.Columns[column]);
                        cell = (DataGridCell)presenter.ItemContainerGenerator.ContainerFromIndex(column);
                    }
                    return cell;
                }
                return null;
            }

            static public DataGridRow GetRow(DataGrid dg, int index)
            {
                DataGridRow row = (DataGridRow)dg.ItemContainerGenerator.ContainerFromIndex(index);
                if (row == null)
                {
                    // may be virtualized, bring into view and try again
                    dg.ScrollIntoView(dg.Items[index]);
                    row = (DataGridRow)dg.ItemContainerGenerator.ContainerFromIndex(index);
                }
                return row;
            }

            static T GetVisualChild<T>(Visual parent) where T : Visual
            {
                T child = default(T);
                int numVisuals = VisualTreeHelper.GetChildrenCount(parent);
                for (int i = 0; i < numVisuals; i++)
                {
                    Visual v = (Visual)VisualTreeHelper.GetChild(parent, i);
                    child = v as T;
                    if (child == null)
                    {
                        child = GetVisualChild<T>(v);
                    }
                    if (child != null)
                    {
                        break;
                    }
                }
                return child;
            }
        }
        #endregion

        #region ParaAlinearALaDerecha
        public static Style newCellStyleAlinearDerecha()
        {
            System.Windows.Style style = new Style(typeof(DataGridCell));
            style.Setters.Add(new System.Windows.Setter
            {
                Property = Control.HorizontalAlignmentProperty,
                Value = HorizontalAlignment.Right
            });
            return style;
        }
        #endregion

        #region ParaRetornarElValorDeUnaCeldaDeUnDataGrid
        private string ReturnDataGridCellText(DataGrid Dtg, object ObjItemFila, int IntColumna)
        {
            string strValorRetornado = "";//FJRF - Limpiamos el valor a retornar

            DataGridRow row = (DataGridRow)Dtg.ItemContainerGenerator.ContainerFromItem(ObjItemFila);//FJRF - Miramos cual es la fila a consultar
            TextBlock cellContent = Dtg.Columns[IntColumna].GetCellContent(row) as TextBlock;//FJRF - Enviamos el dato de la fila y la columna para tener el dato de la celda

            strValorRetornado = cellContent.Text;//FJRF - Retornamos el valor de la celda solo el texto

            return strValorRetornado.Trim();//FJRF - Retornamos el valor sin espacion
        }
        #endregion

        private void Window_KeyDown(object sender, KeyEventArgs e)
        {
            var elemento = e.OriginalSource as UIElement;
            if (e.Key == Key.F3 && elemento != null)
            {
                if (MDOgeneral.logBusquedadAbierta == true) { MDOgeneral.logBusquedadAbierta = false; }
            }

            if (e.Key == Key.F4 && elemento != null)
            {
                if (MDOgeneral.logBusquedadAbierta1 == true) { MDOgeneral.logBusquedadAbierta1 = false; }
            }

            if (e.Key == Key.F5 && elemento != null)
            {
                if (MDOgeneral.logBusquedadAbierta2 == true) { MDOgeneral.logBusquedadAbierta2 = false; }
            }
        }
    }

    public class entMatPr:ObservableObject 
    {
        public void imprimir() 
        {
            try 
            {
                rImpEnt rImp = new rImpEnt { nrohoja = EncEnMatp.HOJNRO_EEN, tipo = EncEnMatp.TIPENT_EEN };
                rImp.consultar();
                rImp.imprimir();
            }
            catch (Exception ex) {MessageBox.Show(ex.Message); }
        }
     
        private static entMatPr instance = null;

        protected entMatPr() 
        {
            MDOgeneral.conectar();
            strTituloVentana = "Entrada de materia prima - Usuario: " + MDOgeneral.usuario + " - [FRMentMatPr]";
        }

        public static entMatPr Instance
        {
            get
            {
                if (instance == null)
                    instance = new entMatPr();
                return instance;
            }
            set 
            { 
                if (instance != null)
                    instance = null;
            }
        }

        #region propiedades

        private string _strTituloVentana;
        public string strTituloVentana
        {
            get { return _strTituloVentana; }
            set { _strTituloVentana = value; RaisePropertyChangedEvent("strTituloVentana"); }
        }

        //Encabezado entrada de mercancias
        private clases.CLSENCENT _EncEnMatp = new clases.CLSENCENT();
        public  clases.CLSENCENT EncEnMatp
        {
            get { return _EncEnMatp; }
            set { _EncEnMatp = value; RaisePropertyChangedEvent("EncEnMatp"); }
        } 

        //Almacenes de materia prima 
        private List<clases.CLSMAEALM> _almacenes = new clases.CLSMAEALM().listaAlmMat();
        public List<clases.CLSMAEALM> almacenes 
        {
            get { return _almacenes; }
            set { _almacenes = value; RaisePropertyChangedEvent("almacenes"); }
        }

        //Proveedores de materia prima
        private List<clases.CLSMAEPRVP> _proveedores = new clases.CLSMAEPRVP().listaProv();
        public List<clases.CLSMAEPRVP> proveedores 
        {
            get { return _proveedores; }
            set { _proveedores = value; RaisePropertyChangedEvent("proveedores"); }
        }

        //Detalle entrada de mercancia
        private MateriaPrimaO _EntMerca = new MateriaPrimaO();
        public MateriaPrimaO EntMerca 
        {
            get { return _EntMerca; }
            set { _EntMerca = value; RaisePropertyChangedEvent("EntMerca"); }
        }

        //Seleccion de detalle de mercancia
        private MateriaPrima _sEntMerca = new MateriaPrima();
        public MateriaPrima sEntMerca
        {
            get { return _sEntMerca; }
            set { _sEntMerca = value; RaisePropertyChangedEvent("sEntMerca"); }
        }

        private double _total=0;
        public double total 
        {
            get { return _total; }
            set { _total = value; RaisePropertyChangedEvent("total"); }
        }

        RelayCommand _cmdBuscarMP;
        public ICommand cmdBuscarMP
        {
            get
            {
                if (_cmdBuscarMP == null)
                {
                    _cmdBuscarMP = new RelayCommand(x => BuscarMP());
                }
                return _cmdBuscarMP;
            }
        }

        private void BuscarMP()
        {
            FRMBuscarCol frm = new FRMBuscarCol();
            frm.RequiereColor = true;
            frm.EsReferencia = false;
            frm.ShowDialog();
            if (!String.IsNullOrEmpty(frm.Retorno))
            {
                sEntMerca.codigo = frm.Retorno.Substring(0,10);
                sEntMerca.descripccion = frm.Retorno.Substring(10);
                clases.CLSMAEMAT mat = new clases.CLSMAEMAT { CODMAT_MAT = sEntMerca.codigo.Substring(0,6) };
                mat.Consultar();
                clases.CLSENCUNI uni = new clases.CLSENCUNI { CODUNI_EUN = mat.UNICOM_MAT };
                uni.Consultar();
                sEntMerca.unicompra = uni.NOMUNI_EUN ;
                clases.CLSPREMTPP cos = new clases.CLSPREMTPP { CODMAT_PMP = sEntMerca.codigo.Substring(0, 6), CODCOL_PMP = sEntMerca.codigo.Substring(6, 4) };
                cos.conCosto();
                sEntMerca.costo = cos.VALOR_PMP ;
            }
        }

        public class MateriaPrimaO : ObservableCollection<MateriaPrima>
        {
            static public MateriaPrimaO cargar(string tipo, string hoja)
            {
                DataTable val = new clases.CLSDETENT { TIPENT_DEN = tipo, HOJNRO_DEN = hoja }.conDetEnt();
                MateriaPrimaO lista=new MateriaPrimaO();
                foreach(DataRow r in val.Rows )
                {
                    lista.Add(new MateriaPrima{ 
                    codigo = r["CODIGO"].ToString(),
                    descripccion = r["NOMMAT_MAT"].ToString(),
                    unicompra = r["NOMUNI_EUN"].ToString(),
                    cantidad = Convert.ToDouble(r["CANPRO_DEN"]),
                    costo = Convert.ToDouble(r["COSPRO_DEN"]),
                    subtotal = Convert.ToDouble(r["CANPRO_DEN"]) * Convert.ToDouble(r["COSPRO_DEN"]),
                    NROORDP_DEN = r["NROORDP_DEN"].ToString(),
                    CAMBIO=false,
                    EXISTE=true
                    });
                }
                return lista;
            }

            static public List<clases.CLSDETENT> descargar(MateriaPrimaO valor, string tipo, string hoja,string orden)
            {
                List<clases.CLSDETENT> val = new List<clases.CLSDETENT>();
                for (int i = 0; i <= valor.Count - 1; i++) 
                {
                    if (valor[i].codigo != null)
                    {
                        if (valor[i].codigo != "")
                        {
                            val.Add(new clases.CLSDETENT
                            {
                                CODMAT_DEN = valor[i].codigo.Substring(0, 6),
                                CODCOL_DEN = valor[i].codigo.Substring(6, 4),
                                CANPRO_DEN = valor[i].cantidad,
                                COSPRO_DEN = valor[i].costo,
                                NROORDP_DEN=orden,
                                EXISTE = valor[i].EXISTE,
                                TIPENT_DEN = tipo,
                                HOJNRO_DEN = hoja
                            });
                        }
                    }
                }
                return val;
            }

            static public DataTable descarToTabla(MateriaPrimaO valor, string tipo, string hoja)
            {
                DataTable val = new DataTable("dtDETENT");
                val.Columns.Add("CODIGO", System.Type.GetType("System.String"));
                val.Columns.Add("DESCRIPCION",System.Type.GetType("System.String"));
                val.Columns.Add("UNIDAD",System.Type.GetType("System.String"));
                val.Columns.Add("CANTIDAD", System.Type.GetType("System.Double"));
                val.Columns.Add("COSTO", System.Type.GetType("System.Double"));
                val.Columns.Add("SUBTOTAL", System.Type.GetType("System.Double"));
                DataRow r;
                for (int i = 0; i <= valor.Count - 1; i++)
                {
                    r = val.NewRow();
                    r["CODIGO"]=valor[i].codigo;
                    r["DESCRIPCION"]=valor[i].descripccion;
                    r["UNIDAD"]=valor[i].unicompra;
                    r["CANTIDAD"]=valor[i].cantidad;
                    r["COSTO"]=valor[i].costo;
                    r["SUBTOTAL"]=valor[i].subtotal;
                    val.Rows.Add(r);
                }
                return val;
            }
        }
        
        public class MateriaPrima:ObservableObject
        {
            private string _codigo;
            public string codigo 
            {
                get { return _codigo; }
                set 
                {
                    if (_codigo != value)
                    {
                        _codigo = value;
                        cambiotext();
                        ActualizarDescripccion();
                        RaisePropertyChangedEvent("codigo");
                    }
                }
            }

            string cam;
            private void cambiotext()
            {
                if (entMatPr.Instance.sEntMerca == null) { return; }
                if (entMatPr.Instance.sEntMerca.codigo == null) { return; }

                if (entMatPr.Instance.sEntMerca.codigo.Length == 9)
                {
                    clases.CLSMAEMAT maemat;
                    maemat = new clases.CLSMAEMAT { CODMAT_MAT = entMatPr.Instance.sEntMerca.codigo.Substring(0, 6) };
                    maemat.ConsMat();
                    if (!maemat.EXISTE)
                    {
                        buscMatp(entMatPr.Instance.sEntMerca.codigo);
                    }
                    cam = codigo;
                }
            }

            private string _descripccion;
            public string descripccion 
            {
                get { return _descripccion; }
                set 
                {
                    if (_descripccion != value) { CAMBIO = true; }
                    _descripccion = value;
                    RaisePropertyChangedEvent("descripccion");
                }
            }

            private string _unicompra;
            public string unicompra 
            {
                get { return _unicompra; }
                set 
                {
                    if (_unicompra != value) { CAMBIO = true; }
                    _unicompra = value;
                    RaisePropertyChangedEvent("unicompra");
                }
            }

            string _NROORDP_DEN;
            public string NROORDP_DEN
            {
                get { return _NROORDP_DEN; }
                set
                {
                    if (_NROORDP_DEN != value) { CAMBIO = true; }
                    _NROORDP_DEN = value;
                    RaisePropertyChangedEvent("NROORDP_DEN");
                }
            } 

            private double _cantidad;
            public double cantidad
            {
                get { return _cantidad; }
                set 
                {
                    if (_cantidad != value) 
                    {
                        CAMBIO = true;                
                        _cantidad = value;
                        ActualizarSubtotal();
                    } 
                    RaisePropertyChangedEvent("cantidad");
                }
            }

            private double _costo;
            public double costo
            {
                get { return _costo; }
                set 
                {
                    if (_costo != value) { CAMBIO = true; }
                    _costo = value;
                    RaisePropertyChangedEvent("costo");
                }
            }

            private double _subtotal;
            public double subtotal
            {
                get { return _subtotal; }
                set 
                {
                    if (_subtotal != value) { CAMBIO = true; }
                    _subtotal = value;
                    RaisePropertyChangedEvent("subtotal");
                }
            }

            private Boolean _CAMBIO = false;
            public Boolean CAMBIO
            {
                get { return _CAMBIO; }
                set { _CAMBIO = value; RaisePropertyChangedEvent("CAMBIO"); }
            }

            private Boolean _EXISTE = false;
            public Boolean EXISTE
            {
                get { return _EXISTE; }
                set { _EXISTE = value; RaisePropertyChangedEvent("EXISTE"); }
            }

            public void buscMatp(string descripcion)
            {
                FRMBuscarCol f = new FRMBuscarCol();

                f.EsReferencia = false;
                f.RequiereColor = true;
                f.txtNombre.Text = descripcion;
                f.txtNombre.Focus();
                f.txtNombre.Select(f.txtNombre.Text.Length, 0);
                f.ShowDialog();

                entMatPr.MateriaPrima mat = entMatPr.Instance.sEntMerca;
                Boolean IsFirst = true;
                foreach (DataRow r in f.dtRetorno.Rows)
                {

                    if (IsFirst)
                    {
                        if (!String.IsNullOrEmpty(r[0].ToString()))
                        {
                            mat.codigo = r[0].ToString();
                        }

                        IsFirst = false;
                    }
                    else
                    {
                        if (!String.IsNullOrEmpty(r[0].ToString()))
                        {
                            entMatPr.Instance.EntMerca.Add(new entMatPr.MateriaPrima { cantidad = 1, codigo = r[0].ToString() });
                        }
                    }
                }

                if (!String.IsNullOrEmpty(f.Retorno))
                {
                    mat.codigo = f.Retorno;
                }
            }

            public void ActualizarDescripccion() 
            {
                if (codigo.Length == 10)
                {
                    clases.CLSMAEMAT maemat = new clases.CLSMAEMAT { CODMAT_MAT = codigo.Substring(0, 6) };
                    maemat.ConsMat();
                    clases.CLSENCUNI uni = new clases.CLSENCUNI { CODUNI_EUN = maemat.UNICOM_MAT };
                    uni.Consultar();
                    clases.CLSPREMTPP cos = new clases.CLSPREMTPP { CODMAT_PMP = codigo.Substring(0, 6), CODCOL_PMP = codigo.Substring(6, 4) };
                    cos.conCosto();
                    descripccion = maemat.NOMMAT_MAT;
                    unicompra = uni.NOMUNI_EUN;
                    costo = cos.VALOR_PMP;
                    subtotal = cantidad * costo;
                }
            }

            public void ActualizarSubtotal()
            { 
                subtotal = cantidad * costo;
            }
        }

        //Existenten errores en el Datagrid de materias primas
        Boolean _ERROR = true;
        public Boolean ERROR
        {
            get { return _ERROR; }
            set { _ERROR = value; RaisePropertyChangedEvent("ERROR"); }
        }

        Boolean _CAMBIO = false;
        public Boolean CAMBIO
        {
            get { return _CAMBIO; }
            set { _CAMBIO = value; RaisePropertyChangedEvent("CAMBIO"); }
        }

        string _NROORDP_DEN;
        public string NROORDP_DEN
        {
            get { return _NROORDP_DEN; }
            set
            {
                if (_NROORDP_DEN != value) { EncEnMatp.CAMBIO = true; }
                _NROORDP_DEN = value;
                RaisePropertyChangedEvent("NROORDP_DEN");
            }
        } 
        #endregion

        #region metodos

        public void consultar() 
        {
            EncEnMatp.consultar();
            if (EncEnMatp.EXISTE)
            {
                EntMerca = MateriaPrimaO.cargar(EncEnMatp.TIPENT_EEN, EncEnMatp.HOJNRO_EEN);
                if (EncEnMatp.TIPENT_EEN.Equals("D")) {
                    NROORDP_DEN = EntMerca[0].NROORDP_DEN;
                }
                totalizar();
            }
            else 
            {
                EntMerca.Clear();
            }
        }
  
        public void guardarMatp(WrapPanel wNot) 
        {
            try
            {
                if (EncEnMatp.GdarEntMatPr(EncEnMatp, MateriaPrimaO.descargar(EntMerca, EncEnMatp.TIPENT_EEN, EncEnMatp.HOJNRO_EEN, NROORDP_DEN)) > 0)
                {
                    consultar();
                    CAMBIO = false;
                    new MDOgeneral.notificar(wNot, "El elemento fue creado correctamente", true);
                }
                else
                {
                    new MDOgeneral.notificar(wNot, "El elemento no puede ser creado correctamente", false);
                }
            }
            catch (Exception ex) { MessageBox.Show(ex.Message); }
        }

        public void nuevMatp() 
        {
            string strValor = "";
            clases.CLSCONTROLP valor=new clases.CLSCONTROLP();
            valor.ID_CON= "ENT";
            if(EncEnMatp.TIPENT_EEN.Equals("N"))
            {
                valor.COD_CON = "NOR";
            }
            else
            {
                valor.COD_CON = "DEV";
            }
            valor.Consultar();
            strValor = Convert.ToString(Convert.ToInt32(valor.NOM_CON.Substring(3)) + 1).Trim();
            EncEnMatp.HOJNRO_EEN = valor.NOM_CON.Substring(0, 2) + ("00000000" + strValor).Substring(4);
        }

        public void totalizar() 
        {
            total = 0;
            for (int i = 0; i <= EntMerca.Count - 1; i++) 
            {
                total = total + EntMerca[i].subtotal;
            }
        }

        public void ConsPro()
        {
            clases.CLSMAEPRVP mae = new clases.CLSMAEPRVP();
            FRMbuscar f = new FRMbuscar(mae, "buscar", "Nombre", "NOMPRV_PRV", "Codigo");
            f.ShowDialog();
            if (!f.retorno.Equals(""))
            {
                if (EncEnMatp.CODPRV_EEN != f.retorno)
                {
                    EncEnMatp.CODPRV_EEN = f.retorno;
                }
            }
        }

    #endregion
    }
}
